import pandas as pd
import urllib
import numpy as np
import urllib.request
import re
from textblob import TextBlob
%run lib.py
#name="Legally%20Blonde"
#name="aboutmary"
#name="10Things"
name="magnolia"
#name="Friday%20The%2013th"
#name="Ghost%20Ship"
#name="Juno"
#name="Reservoir+Dogs"
#name="shawshank"
#name="Sixth%20Sense,%20The"
#name="sunset_bld_3_21_49"
#name="Titanic"
#name="toy_story"
#name="trainspotting"
#name="transformers"
#name="the-truman-show_shooting"
#name="batman_production"
ext="html"
txtfiles=["Ghost%20Ship", "Legally%20Blonde", "Friday%20The%2013th", "Juno", "Reservoir+Dogs", "Sixth%20Sense,%20The", "Titanic"]
if name in txtfiles:
ext="txt"
fp = urllib.request.urlopen("http://www.dailyscript.com/scripts/"+name+"."+ext)
mybytes = fp.read()
mystr = mybytes.decode("utf8", "ignore")
fp.close()
liston=mystr.split("\n")
liston=[s.replace('\r', '') for s in liston]
liston=[re.sub('<[^<]+?>', '', text) for text in liston]
if name=="shawshank":
liston=[i.replace("\t", " ") for i in liston]
char=""
script=[]
charintro=' '
endofdialogue=' '
dialoguepre=' '
newscenepre=' '
charintro=''
endofdialogue=''
dialoguepre=''
newscenepre=''
i=45
print("Characters")
i, charintro=nextbigchunk(liston, i)
print("Adverbs")
i, adverb=nextbigchunk(liston, i, adverbs=True)
print("Dialogues")
i, dialoguepre=nextbigchunk(liston, i)
print("New Scene:")
i, newscenepre=nextbigchunk(liston, i)
if newscenepre=="X":
i=100
i, newscenepre=nextbigchunk(liston, i)
if name=="aboutmary":
newscenepre=" ".join(["" for i in range(56)])
if len(newscenepre)==len(charintro):
newscenepre="X"
endofdialogue=newscenepre
scene=1
for s in liston:
if s[0:len(charintro)]==charintro and s[len(charintro)]!=" " and s.strip()[0]!="(" and s.strip()[len(s.strip())-1]!=")":
#print("Charatcer*****")
char=s[len(charintro):]
new=dict()
new['char']=char.strip()
new['dialogue']=""
new['scene']=scene
new['adverb']=""
if s==endofdialogue or s.replace(" ", "")=="":
if char!="":
char=""
script.append(new)
if char!="" and s[0:len(dialoguepre)]==dialoguepre and s[len(dialoguepre)]!=" ":
#print("Dialogue******")
if new['dialogue']!="":
new['dialogue']=new['dialogue']+" "
new['dialogue']=new['dialogue']+s[len(dialoguepre):]
if char!="" and ((s[0:len(adverb)]==adverb and s[len(adverb)]!=" ") or (len(s)>1 and s.strip()[0]=="(" and s.strip()[len(s.strip())-1]==")" )):
if new['adverb']!="":
new['adverb']=new['adverb']+" "
new['adverb']=new['adverb']+s[len(adverb):]
if s[0:len(newscenepre)]==newscenepre and len(s)>len(newscenepre) and ( s.isupper()) and s[len(newscenepre)]!=" ":
scene=scene+1
pd.DataFrame(script).to_csv(name+'.csv', index=None)
pd.DataFrame(script)
magnolia=pd.read_csv(name+'.csv')
stopwords = getstopwords()
removedchars=["'S VOICE", "'S WHISPER VOICE", " GATOR"]
for s in removedchars:
magnolia['char']=magnolia['char'].apply(lambda x: x.replace(s, ""))
i=0
scenes=dict()
for s in magnolia.iterrows():
scenes[s[1]['scene']]=[]
for s in magnolia.iterrows():
scenes[s[1]['scene']].append(s[1]['char'])
for s in magnolia.iterrows():
scenes[s[1]['scene']]=list(set(scenes[s[1]['scene']]))
characters=[]
for s in scenes:
for k in scenes[s]:
characters.append(k)
characters=list(set(characters))
appearances=dict()
for s in characters:
appearances[s]=0
for s in magnolia.iterrows():
appearances[s[1]['char']]=appearances[s[1]['char']]+1
a=pd.DataFrame(appearances, index=[i for i in range(len(appearances))])
finalcharacters=[]
for s in pd.DataFrame(a.transpose()[0].sort_values(0, ascending=False))[0:10].iterrows():
finalcharacters.append(s[0])
finalcharacters
file=open(name+"_nodes.csv", "w")
couplesappearances=dict()
for s in finalcharacters:
file.write(";")
file.write(s)
file.write("\n")
for s in finalcharacters:
newlist=[]
for f in finalcharacters:
newlist.append(0)
couplesappearances[f+"_"+s]=0
j=0
for f in finalcharacters:
for p in scenes:
if f in scenes[p] and s in scenes[p] and f!=s and finalcharacters.index(f)<finalcharacters.index(s):
long=len(magnolia[magnolia["scene"]==p])
newlist[j]=newlist[j]+long
couplesappearances[f+"_"+s]=couplesappearances[f+"_"+s]+long
j=j+1
file.write(s)
for f in newlist:
file.write(";")
file.write(str(f))
file.write("\n")
file.close()
a=pd.DataFrame(couplesappearances, index=[i for i in range(len(couplesappearances))])
finalcouples=[]
for s in pd.DataFrame(a.transpose()[0].sort_values(0, ascending=False))[0:4].iterrows():
finalcouples.append(s[0])
file=open(name+"_finalcharacters.csv", "w")
for s in finalcharacters:
file.write(s+"\n")
file.close()
file=open(name+"_finalcouples.csv", "w")
for s in finalcouples:
file.write(s+"\n")
file.close()
importantchars=[]
for char in appearances:
if appearances[char]>10:
importantchars.append(char)
file=open(name+"_sentiment_overtime_individual.csv", "w")
file2=open(name+"_sentiment_overtime_individualminsmaxs.csv", "w")
for k in finalcharacters:
print(k)
dd=getdialogue(magnolia, k, k, scenes)
dd=[str(d) for d in dd]
polarities, subjectivities=getsentiment(dd)
%matplotlib inline
import matplotlib.pyplot as plt
moveda=maverage(polarities, dd, .99)
plt.plot(moveda)
i=0
for s in moveda:
file.write(k+","+str(float(i)/len(moveda))+", "+str(s)+"\n")
i=i+1
plt.ylabel('polarities')
plt.show()
file2.write(k+"| MIN| "+dd[moveda.index(np.min(moveda))]+"\n")
file2.write(k+"| MAX| "+dd[moveda.index(np.max(moveda))]+"\n")
print("MIN: "+dd[moveda.index(np.min(moveda))])
print("\n")
print("MAX: "+dd[moveda.index(np.max(moveda))])
file.close()
file2.close()
file=open(name+"_sentiment_overtime_couples.csv", "w")
file2=open(name+"_sentiment_overtime_couplesminsmaxs.csv", "w")
for k in finalcouples:
print(k)
liston=k.split("_")
dd=getdialogue(magnolia, liston[0], liston[1], scenes)
dd=[str(d) for d in dd]
polarities, subjectivities=getsentiment(dd)
%matplotlib inline
import matplotlib.pyplot as plt
moveda=maverage(polarities, dd, .99)
plt.plot(moveda)
i=0
for s in moveda:
file.write(k+","+str(float(i)/len(moveda))+", "+str(s)+"\n")
i=i+1
plt.ylabel('polarities')
plt.show()
file2.write(k+"| MIN| "+dd[moveda.index(np.min(moveda))]+"\n")
file2.write(k+"| MAX| "+dd[moveda.index(np.max(moveda))]+"\n")
print("MIN: "+dd[moveda.index(np.min(moveda))])
print("\n")
print("MAX: "+dd[moveda.index(np.max(moveda))])
file.close()
file2.close()
for key, val in scenes.items():
for s in scenes[key]:
new="INSCENE_"+scenes[key][0]
scenes[key].remove(scenes[key][0])
scenes[key].append(new)
magnolia.dropna(subset=['dialogue'])
1
baskets=[]
spchars=["\"", "'", ".", ",", "-"]
attributes=["?", "!"]
for s in magnolia.iterrows():
if type(s[1]['dialogue'])!=float and len(s[1]['dialogue'])>0:
new=[]
for k in scenes[s[1]['scene']]:
new.append(k)
new.append("SPEAKING_"+s[1]['char'])
for k in s[1]['dialogue'].split(" "):
ko=k
for t in spchars:
ko=ko.replace(t, "")
for t in attributes:
if ko.find(t)>=0:
new.append(t)
ko=ko.replace(t, "")
if len(ko)>0:
new.append(ko.lower())
new=list(set(new))
baskets.append(new)
baskets2=[]
basketslist=[]
for k in baskets:
new=dict()
new2=[]
for t in k:
if t not in stopwords:
new[t]=1
new2.append(t)
baskets2.append(new)
basketslist.append(new2)
baskets2=pd.DataFrame(baskets2)
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
baskets2=baskets2.fillna(0)
baskets2.to_csv(name+'_basket.csv')
frequent_itemsets = apriori(baskets2, min_support=5/len(baskets2), use_colnames=True)
rules = association_rules(frequent_itemsets, metric="lift", min_threshold=1)
rules['one_lower']=[int(alllower(i) or alllower(j)) for i, j in zip(rules['antecedants'], rules['consequents'])]
rules['both_lower']=[int(alllower(i) and alllower(j)) for i, j in zip(rules['antecedants'], rules['consequents'])]
rules.to_csv(name+'_rules.csv', index=None)
| . |
|---|
| TED |
| Palabras Distintas |
|---|
| 1859 |
| Descripcion | Score | % Founded Words |
|---|---|---|
| Entre 0 (negativo) y 10 (positivo) | 4.968215 | 12% |
| sentiment | Porcentaje |
|---|---|
| positive | 55.4% |
| negative | 44.6% |
| sentiment | Porcentaje |
|---|---|
| positive | 19.8% |
| negative | 14.8% |
| trust | 12.1% |
| joy | 11.5% |
| anticipation | 10.5% |
| fear | 6.9% |
| anger | 6.7% |
| sadness | 6.3% |
| surprise | 6.1% |
| disgust | 5.3% |
| sentiment | Porcentaje |
|---|---|
| negative | 35.9% |
| positive | 35.0% |
| uncertainty | 24.9% |
| litigious | 3.0% |
| constraining | 1.3% |
[1] “Analisis de Sentimientos del Personaje: TED” [1] “Numero total de Palabras Unicas en el texto: 658”
| Descripcion | Score | % Founded Words |
|---|---|---|
| Entre 0 (negativo) y 10 (positivo) | 4.946809 | 13.1% |
| sentiment | Porcentaje |
|---|---|
| positive | 58.5% |
| negative | 41.5% |
| sentiment | Porcentaje |
|---|---|
| positive | 19.0% |
| negative | 14.7% |
| trust | 12.7% |
| anticipation | 12.2% |
| joy | 11.0% |
| fear | 7.5% |
| sadness | 6.5% |
| anger | 6.2% |
| surprise | 6.0% |
| disgust | 4.2% |
| sentiment | Porcentaje |
|---|---|
| positive | 40.0% |
| uncertainty | 30.9% |
| negative | 29.1% |
[1] “Analisis de Sentimientos del Personaje: MARY” [1] “Numero total de Palabras Unicas en el texto: 615”
| Descripcion | Score | % Founded Words |
|---|---|---|
| Entre 0 (negativo) y 10 (positivo) | 5.877698 | 9.92% |
| sentiment | Porcentaje |
|---|---|
| positive | 70.9% |
| negative | 29.1% |
| sentiment | Porcentaje |
|---|---|
| positive | 22.7% |
| joy | 15.2% |
| trust | 12.5% |
| anticipation | 11.2% |
| negative | 10.7% |
| surprise | 8.3% |
| sadness | 5.9% |
| fear | 5.1% |
| anger | 4.5% |
| disgust | 4.0% |
| sentiment | Porcentaje |
|---|---|
| positive | 35.3% |
| uncertainty | 35.3% |
| negative | 21.6% |
| constraining | 3.9% |
| litigious | 3.9% |
[1] “Analisis de Sentimientos del Personaje: HEALY” [1] “Numero total de Palabras Unicas en el texto: 711”
| Descripcion | Score | % Founded Words |
|---|---|---|
| Entre 0 (negativo) y 10 (positivo) | 4.897297 | 11% |
| sentiment | Porcentaje |
|---|---|
| positive | 54.75% |
| negative | 45.25% |
| sentiment | Porcentaje |
|---|---|
| positive | 19.4% |
| negative | 15.3% |
| trust | 12.3% |
| joy | 12.0% |
| anticipation | 10.5% |
| surprise | 6.6% |
| sadness | 6.4% |
| anger | 6.1% |
| disgust | 5.9% |
| fear | 5.4% |
| sentiment | Porcentaje |
|---|---|
| positive | 45.2% |
| negative | 31.0% |
| uncertainty | 23.8% |
[1] “Analisis de Sentimientos del Personaje: DOM” [1] “Numero total de Palabras Unicas en el texto: 411”
| Descripcion | Score | % Founded Words |
|---|---|---|
| Entre 0 (negativo) y 10 (positivo) | 4.705128 | 13.4% |
| sentiment | Porcentaje |
|---|---|
| negative | 50% |
| positive | 50% |
| sentiment | Porcentaje |
|---|---|
| positive | 20.9% |
| negative | 16.6% |
| trust | 13.5% |
| joy | 12.9% |
| anger | 8.0% |
| anticipation | 8.0% |
| fear | 5.5% |
| surprise | 5.5% |
| sadness | 4.9% |
| disgust | 4.3% |
| sentiment | Porcentaje |
|---|---|
| negative | 47.6% |
| positive | 33.3% |
| litigious | 9.5% |
| uncertainty | 9.5% |
[1] “Analisis de Sentimientos del Personaje: TUCKER” [1] “Numero total de Palabras Unicas en el texto: 395”
| Descripcion | Score | % Founded Words |
|---|---|---|
| Entre 0 (negativo) y 10 (positivo) | 4.821429 | 11.6% |
| sentiment | Porcentaje |
|---|---|
| positive | 50.88% |
| negative | 49.12% |
| sentiment | Porcentaje |
|---|---|
| positive | 20.7% |
| negative | 15.9% |
| trust | 11.0% |
| fear | 9.8% |
| anger | 9.1% |
| sadness | 9.1% |
| joy | 8.5% |
| anticipation | 6.7% |
| disgust | 5.5% |
| surprise | 3.7% |
| sentiment | Porcentaje |
|---|---|
| negative | 55.6% |
| positive | 22.2% |
| uncertainty | 11.1% |
| constraining | 5.6% |
| litigious | 5.6% |
[1] “Analisis de Sentimientos del Personaje: MAGDA” [1] “Numero total de Palabras Unicas en el texto: 253”
| Descripcion | Score | % Founded Words |
|---|---|---|
| Entre 0 (negativo) y 10 (positivo) | 4.263158 | 12.6% |
| sentiment | Porcentaje |
|---|---|
| negative | 65.8% |
| positive | 34.2% |
| sentiment | Porcentaje |
|---|---|
| negative | 21.1% |
| fear | 12.3% |
| positive | 12.3% |
| anticipation | 10.5% |
| anger | 9.6% |
| sadness | 8.8% |
| disgust | 7.9% |
| joy | 7.0% |
| surprise | 5.3% |
| trust | 5.3% |
| sentiment | Porcentaje |
|---|---|
| negative | 80% |
| positive | 20% |
[1] “Analisis de Sentimientos del Personaje: SULLY” [1] “Numero total de Palabras Unicas en el texto: 125”
| Descripcion | Score | % Founded Words |
|---|---|---|
| Entre 0 (negativo) y 10 (positivo) | 3.8 | 13.6% |
| sentiment | Porcentaje |
|---|---|
| negative | 58.3% |
| positive | 41.7% |
| sentiment | Porcentaje |
|---|---|
| negative | 25.5% |
| disgust | 15.7% |
| anger | 11.8% |
| fear | 11.8% |
| anticipation | 7.8% |
| joy | 5.9% |
| positive | 5.9% |
| sadness | 5.9% |
| trust | 5.9% |
| surprise | 3.9% |
| sentiment | Porcentaje |
|---|---|
| negative | 50.0% |
| positive | 37.5% |
| uncertainty | 12.5% |
[1] “Analisis de Sentimientos del Personaje: MARY’S MOM” [1] “Numero total de Palabras Unicas en el texto: 95”
| Descripcion | Score | % Founded Words |
|---|---|---|
| Entre 0 (negativo) y 10 (positivo) | 5.6 | 5.26% |
| sentiment | Porcentaje |
|---|---|
| negative | 50% |
| positive | 50% |
| sentiment | Porcentaje |
|---|---|
| positive | 31.2% |
| joy | 18.8% |
| anticipation | 12.5% |
| negative | 12.5% |
| trust | 12.5% |
| sadness | 6.2% |
| surprise | 6.2% |
| sentiment | Porcentaje |
|---|---|
| negative | 100% |
[1] “Analisis de Sentimientos del Personaje: MARY’S DAD” [1] “Numero total de Palabras Unicas en el texto: 90”
| Descripcion | Score | % Founded Words |
|---|---|---|
| Entre 0 (negativo) y 10 (positivo) | 5 | 6.67% |
| sentiment | Porcentaje |
|---|---|
| positive | 62.5% |
| negative | 37.5% |
| sentiment | Porcentaje |
|---|---|
| anticipation | 14.29% |
| negative | 14.29% |
| positive | 14.29% |
| sadness | 14.29% |
| anger | 9.52% |
| fear | 9.52% |
| trust | 9.52% |
| disgust | 4.76% |
| joy | 4.76% |
| surprise | 4.76% |
| sentiment | Porcentaje |
|---|---|
| negative | 100% |
[1] “Analisis de Sentimientos del Personaje: WARREN” [1] “Numero total de Palabras Unicas en el texto: 26”
| Descripcion | Score | % Founded Words |
|---|---|---|
| Entre 0 (negativo) y 10 (positivo) | 5.5 | 7.69% |
| sentiment | Porcentaje |
|---|---|
| negative | 50% |
| positive | 50% |
| sentiment | Porcentaje |
|---|---|
| anticipation | 25.0% |
| anger | 12.5% |
| joy | 12.5% |
| negative | 12.5% |
| positive | 12.5% |
| surprise | 12.5% |
| trust | 12.5% |
| sentiment | Porcentaje |
|---|---|
| positive | 100% |
[1] “Analisis de Sentimientos del Personaje: FRIEND #1” [1] “Numero total de Palabras Unicas en el texto: 79”
| Descripcion | Score | % Founded Words |
|---|---|---|
| Entre 0 (negativo) y 10 (positivo) | 3.818182 | 11.4% |
| sentiment | Porcentaje |
|---|---|
| negative | 63.6% |
| positive | 36.4% |
| sentiment | Porcentaje |
|---|---|
| positive | 32% |
| anticipation | 16% |
| joy | 12% |
| negative | 12% |
| trust | 12% |
| disgust | 8% |
| anger | 4% |
| fear | 4% |
Table: Porcentaje de Palabras encontradas por tipo de sentimiento ( loughran ) 0%
sentiment Porcentaje ———- ————
[1] “Analisis de Sentimientos del Personaje: HITCHHIKER” [1] “Numero total de Palabras Unicas en el texto: 121”
| Descripcion | Score | % Founded Words |
|---|---|---|
| Entre 0 (negativo) y 10 (positivo) | 6.285714 | 5.79% |
| sentiment | Porcentaje |
|---|---|
| positive | 80% |
| negative | 20% |
| sentiment | Porcentaje |
|---|---|
| positive | 34.6% |
| trust | 23.1% |
| anticipation | 15.4% |
| joy | 15.4% |
| surprise | 7.7% |
| anger | 3.8% |
| sentiment | Porcentaje |
|---|---|
| positive | 40% |
| litigious | 20% |
| negative | 20% |
| uncertainty | 20% |
| Personaje | Min_Max | Dialogo |
|---|---|---|
| TED | MIN | You’re Woogie? |
| TED | MAX | No, it’s an old football injury. |
| MARY | MIN | But I think I’d be happiest…with you. |
| MARY | MAX | That’s right. And the good thing is you can do it anywhere. |
| HEALY | MIN | He’s no friend of mine. |
| HEALY | MAX | Fine. Fine. |
| DOM | MIN | Dom Wooganowski. Duh. |
| DOM | MAX | Hey, look on the bright side– |
| TUCKER | MIN | I’ve got a friend in the Boston police department. He faxed me this this morning. I’ll just give you the highlights. After a short stint as a petty thief, Patrick R. Healy graduated to armed robbery by the age of fourteen. At sixteen he committed his first murder–a pretty teacher’s aid named Molly Pettygrove. He was incarcerated until age twenty-two when, despite a grim psychological profile, the state was forced to release him. In his mid-twenties and again in his early thirties he was suspected of homicides in the states of Utah and Washington. Unfortunately, the bodies were so badly decomposed that there wasn’t enough evidence to hold him, and on and on and so forth and so on. |
| TUCKER | MAX | You heard me, goddamnit. I…I love her. |
| MAGDA | MIN | That’s because there’s a lot of bad people out there. Hey, Puffy tried to warn you about that Steve guy you was seeing–he was a fucking asswipe–but you had to find out for yourself, didn’t you? |
| MAGDA | MAX | Knock it off, Pollyanna, just ’cause you’re in love doesn’t mean everyone else has to be. |
| SULLY | MIN | That’s bullshit, man you, uh, you were on the front line. Remember the, uh, malaria the, uh, typhoon fever that vicious strain of genital herpes? |
| SULLY | MAX | Fuckin’ Patrick Healy, you think your shit don’t stink. Well I got news for you–you’re goddamn right it don’t! How the hell are ya?! |
| MARY’S MOM | MIN | Charlie, do something. |
| MARY’S MOM | MAX | Charlie, that’s mean. Come on in, Ted. Don’t listen to Mr. Wise Guy here. He’s a joke a minute. |
| MARY’S DAD | MIN | What the hell are you doing?! |
| MARY’S DAD | MAX | How the hell’d you get the beans all the way up top like that? |
| WARREN | MIN | Huh? |
| WARREN | MAX | Good, Ted. Piggy back ride? |
| Parejas | Min_Max | Dialogo |
|---|---|---|
| MARY_HEALY | MIN | Oh. So…what brings you down here? |
| MARY_HEALY | MAX | We just got here thirty seconds ago. Isn’t this stuff great? |
| TED_MARY | MIN | Hi, Ted. |
| TED_MARY | MAX | Ted, are you okay? |
| HEALY_TUCKER | MIN | Dom, you’re pathetic, fucking over your friend Ted like that. |
| HEALY_TUCKER | MAX | Look, you asked me to follow your girl around, and I did and I started to like her, and then I realized I just couldn’t in good conscience do it. |
| TED_DOM | MIN | Dom Wooganowski. Duh. |
| TED_DOM | MAX | Maybe you’re right. I should look on the bright side. I mean, I’ve still got my health… I’m out of here. I’ve got to get up at six a.m. to move my boss’s brother into his apartment. |
## [1] "Lift Promedio de las Reglas de Asociacion: 20.3813707550261"
## [1] "Desviación estandar del Lift de las Reglas de Asociacion: 13.3145326352053"
## [1] "Deciles del Lift : "
## 10% 20% 30% 40% 50% 60%
## 1.832827 4.855072 10.806452 16.209677 23.928571 23.928571
## 70% 80% 90% 100%
## 29.558824 29.558824 35.892857 167.500000
| Numero de Dialogos | Lift Minimo | Lift Maximo |
|---|---|---|
| 44,544 | -3 | 3 |
| 41,594 | 3 | 9 |
| 18,650 | 9 | 14 |
| 28,586 | 14 | 20 |
| 71,190 | 20 | 26 |
| 64,044 | 26 | 32 |
## [1] "Leverage Promedio de las Reglas de Asociacion: 0.00810205979613019"
## [1] "Desviación estandar del Leverage de las Reglas de Asociacion: 0.00700157827387452"
## [1] "Deciles del Leverage : "
## 10% 20% 30% 40% 50% 60%
## 0.003588030 0.004767209 0.004806812 0.005584020 0.005828569 0.006674092
## 70% 80% 90% 100%
## 0.007627534 0.010487859 0.012497710 0.104923145
| Numero de Dialogos | Leverage Minimo | Leverage Maximo |
|---|---|---|
| 7,148 | -0.0018 | 0.0018 |
| 112,936 | 0.0018 | 0.0054 |
| 121,294 | 0.0054 | 0.009 |
| 39,152 | 0.009 | 0.013 |
| 4,612 | 0.013 | 0.016 |
| 4,692 | 0.016 | 0.02 |
Pagerank: About Marie.